[AWS 입문] AWS Amplify + Android 프로젝트 생성하기
안녕하세요! 올해 4월부로 클래스메소드 주식회사에 신입 엔지니어로 입사한 정하은이라고 합니다?
입사하고 지금까지는 일본어 블로그만 썼었는데 드디어 한국어로 쓰게 되는 날이 오다니... 제 부족한 기술력을 적나라하게 드러날 걸 생각하니 긴장이 되네요ㅎㅎ AWS 무경험이었던 상태로 입사 전에 급하게 기초만 떼고, 매일 새로운 도전을 하는 기분을 맛보고 있지만 많은 분들께 AWS의 매력을 알리고자 도전합니다!
이번 블로그에서는 제가 대학시절에 가장 즐겁게 개발했던 Android 앱과 AWS의 서비스를 연동해보고 싶어 공부한 AWS Amplify에 대해 다뤄볼게요.
왜 Amplify를 쓰는건가요?
우선 Amplify 공식 설명에서는 Amplify를 이렇게 한마디로 이야기합니다.
AWS Amplify는 안전하고 확장 가능한 모바일 및 웹 애플리케이션을 구축하기 위한 개발 플랫폼입니다.
이 설명만으로는 무슨 역할을 하는지 잘 모르겠지만 모바일이나 웹 앱을 개발하는데 있어 활용할 수 있겠다는 것은 알겠네요. 잠시 다음 상황을 가정해봅시다.
저는 대학시절에 프로젝트로 Android 앱 개발을 하면서 위와 같은 고민을 많이 했었어요. 백엔드 개발의 경우, 검색했을 때 그나마 정보가 많이 나왔던 Firebase로 백엔드 역할을 대체해버리기도 했었어요... (나만 그런게 아니라고 주장하고 싶다ㅠㅠ) 그리고 매번 새로운 기능을 위한 라이브러리와 사용법을 검색해가면서 찾는 것도 시간적으로 낭비가 많았어요.
하지만 요즘 AWS에 대해 알아보기 시작하면서 Amplify가 이 문제에 대해 해결해 줄 수 있을 것 같다는 생각이 들었는데요! 실제로 Amplify는 앱 개발 시에 필수적인 백엔드 구현, 배포, 테스트와 같은 단계를 손쉽게 할 수 있도록 도와주는 역할을 해요.
Amplify + Android 프로젝트 생성하기
먼저 주의 사항을 이야기하면, 저는 Windows 10을 사용 중이기 때문에 커맨드 입력이나 화면 출력 등의 차이가 있다는 부분을 염두하고 읽어주셨으면 해요. re:Invent 2019에서 Amplify for iOS and Android 프리뷰가 나왔다는 발표가 있었다는데 이게 Mac만 지원한다니 고통스럽네요ㅠㅠ
(2020/06/27 수정)
2020/05/26에 정식적으로 Android와 iOS용 Amplify 라이브러리가 발표가 되었습니다! 혹시라도 라이브러리를 사용하고 싶으신 분들의 경우, Amplify 공식문서를 참고해 주시길 바래요! 제 Amplify 블로그 시리즈에서는 SDK 사용법을 중심으로 작성 되어있습니다.
그리고 실습해보기 전에 아래 사항이 갖추어졌는지 확인해주세요.
- Node.js 버전 10.x 이상
- Android Studio 3.6 이상
- Android SDK 버전 16 (Android 4.1) 이상
- AWS Management Console 계정 (AWS를 사용하기 위해서는 꼭 필요하니 없다면 회원가입하기!)
준비를 마치셨다면 시작해봅시다!
Amplify CLI 설치
Amplify Framework를 사용하기 위해서는 CLI를 설치해야하니 아래의 커맨드를 cmd에 입력해주세요.
npm install -g @aws-amplify
설치가 제대로 완료되면 위와 같은 문구가 뜨는걸 확인할 수 있어요.
IAM 사용자 추가
다음은 Amplify를 위한 사용자를 하나 더 만들어볼건데요. 여기서 '이미 사용자 계정은 만들었는데요?'라고 생각하시는 분이 계실 것 같네요. 하지만 앞서 만들어진 루트 사용자만 사용할 경우, 문제가 발생했을 때의 추적이나 해결이 어려워지기 때문에 IAM 사용자로 나누어 사용하는 것을 권장합니다.
그럼 사용자 추가를 위해 cmd에 amplify configure
를 입력해주세요. 기다리다보면 로그인 창이 나오거나 로그인 된 상태인 경우, 홈 화면이 나오게 되는데 로그인을 완료하면 cmd로 돌아가 Enter를 눌러주세요.
그러면 리전을 선택하라고 나오는데, 자신의 리전에 맞춰 선택하시면 돼요. 저는 회사 계정을 사용 중이기 때문에 도쿄 리전을 선택했습니다. 사용자명은 임의로 생성해주는 이름을 사용해도 상관없지만, 저는 약간 수정했어요.
기다리면 계정 생성을 위한 창이 뜰 거에요. 사진을 보니 제가 비밀번호 만들기에 체크를 안했었는데, 비밀번호 추가하시는 걸 추천드려요. 나중에 Amplify 프로젝트를 추가했을 때 콘솔에서 확인할 수 있답니다. 비밀번호는 IAM에서도 설정 가능하지만 괜히 일을 두 번 해야하는 것보다는 미리 해두는게 나으니까요! 비밀번호 재설정 체크는 해제해주세요.
Administrator Access는 보안상 좋지 않지만, 테스트이기 때문에 그냥 다음으로 넘어가주세요.
tag도 필요하지 않으니 넘어가주세요.
마지막으로 정보가 맞는지 확인한 후, '사용자 만들기' 버튼을 클릭해주세요.
사용자 생성에 성공했다는 문구가 뜨면서, 액세스 키와 비밀 액세스 키가 뜨는 걸 확인할 수 있어요. 비밀 액세스 키는 이 창에서 나가면 다시 확인할 수 없기 때문에 .csv 파일을 저장해주세요. 단, 다음 단계에서 만들 프로젝트 폴더에는 절대 옮기시면 안돼요!!!
그리고 다시 cmd로 돌아가서 액세스 키와 비밀 액세스 키, 프로파일명을 입력해주세요. 프로파일명은 default여도 상관없지만 테스트용이기 때문에 저는 사용자명과 동일하게 지었어요.
Android 프로젝트 만들기
Andorid Studio를 실행하면 위와 같은 화면이 뜰 텐데요. 여기서 Start a new Android Studio Project
를 클릭하여 프로젝트를 생성해볼게요.
프로젝트 템플릿은 Empty Activity(빈 액티비티)로 선택할게요.
마지막으로 위처럼 입력하고 Finish를 눌러주세요.
아래에서 돌아가는 긴 로딩을 끝마치면 Android 프로젝트 생성은 완료입니다!
amplify init
자, 이제 마지막 Amplify 프로젝트 생성만 남겨두었네요!
cmd 창을 다시 열고, cd 커맨드로 아까 만들었던 Android 프로젝트 폴더로 이동해주세요. 그리고 amplify init
을 입력해주세요.
? 표시와 함께 입력하라는 문구가 나오는데, 위처럼 적어주시면 돼요. 그러고보니 'name for environment'가 뭔가요라고 질문이 나올 거 같은 느낌이 드네요... amplify CLI에는 기능 브랜치 워크플로라는게 있는데요. dev, test, prod 라는 환경으로 나뉘며, 각 environment에 맞는 백엔드 설정을 해준답니다. git의 브랜치 전환과 비슷하다고 생각하시면 될 것 같습니다.
입력 후 잠시 기다리시면 'Do you want to use an AWS profile?'이라는 문구가 뜹니다. 앞서 저희가 amplify configure
로 프로파일을 생성해두었기 때문에 'Y'와 'amplify-test'를 선택해서 넘어가주세요.
조금 기다리니 드디어 Amplify 프로젝트 생성에 성공했다는 문구가 나오네요! ?
AWS Management Console에서 'AWS Amplify' 서비스에서도 프로젝트가 추가된 것을 확인할 수 있답니다.
* 혹시나 init failed라는 문구가 뜬다면...
사실 위 방법대로면 실패하는 경우는 없겠지만, '난 amplify configure
로 새 사용자 만들기 싫은걸! 만들어 둔 걸로 할래!' 라고 생각하셔서 AWS CLI에서 aws configure
로 이미 프로파일 설정을 마치셨던 분들은 이 오류가 나올거에요. amplify configure
로 생성하지 않은 IAM 유저로 Amplify 프로젝트 생성을 시도하면 'AccessDeniedException'이라는 문구가 뜨실텐데요. 사용자가 Amplify 서비스에 필요한 권한을 갖고 있지 않기 때문에 생기는 오류입니다. 이 때는 아래의 과정을 거쳐야해요.
먼저, Amplify 프로젝트를 생성할 IAM 유저의 IAM 콘솔로 접속해 '인라인 정책 추가' 문구를 클릭해주세요.
JSON 탭을 클릭하고, 코드 블럭에 아래의 코드를 복붙해주세요! 문자 수가 초과한다는 말이 나오지만 그냥 정책 검토 버튼을 눌러서 넘어가주세요.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "appsync:*", "apigateway:POST", "apigateway:DELETE", "apigateway:PATCH", "apigateway:PUT", "cloudformation:CreateStack", "cloudformation:CreateStackSet", "cloudformation:DeleteStack", "cloudformation:DeleteStackSet", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResource", "cloudformation:DescribeStackResources", "cloudformation:DescribeStackSet", "cloudformation:DescribeStackSetOperation", "cloudformation:DescribeStacks", "cloudformation:UpdateStack", "cloudformation:UpdateStackSet", "cloudfront:CreateCloudFrontOriginAccessIdentity", "cloudfront:CreateDistribution", "cloudfront:DeleteCloudFrontOriginAccessIdentity", "cloudfront:DeleteDistribution", "cloudfront:GetCloudFrontOriginAccessIdentity", "cloudfront:GetCloudFrontOriginAccessIdentityConfig", "cloudfront:GetDistribution", "cloudfront:GetDistributionConfig", "cloudfront:TagResource", "cloudfront:UntagResource", "cloudfront:UpdateCloudFrontOriginAccessIdentity", "cloudfront:UpdateDistribution", "cognito-identity:CreateIdentityPool", "cognito-identity:DeleteIdentityPool", "cognito-identity:DescribeIdentity", "cognito-identity:DescribeIdentityPool", "cognito-identity:SetIdentityPoolRoles", "cognito-identity:UpdateIdentityPool", "cognito-idp:CreateUserPool", "cognito-idp:CreateUserPoolClient", "cognito-idp:DeleteUserPool", "cognito-idp:DeleteUserPoolClient", "cognito-idp:DescribeUserPool", "cognito-idp:UpdateUserPool", "cognito-idp:UpdateUserPoolClient", "dynamodb:CreateTable", "dynamodb:DeleteItem", "dynamodb:DeleteTable", "dynamodb:DescribeTable", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:UpdateTable", "iam:CreateRole", "iam:DeleteRole", "iam:DeleteRolePolicy", "iam:GetRole", "iam:GetUser", "iam:PassRole", "iam:PutRolePolicy", "iam:UpdateRole", "lambda:AddPermission", "lambda:CreateFunction", "lambda:DeleteFunction", "lambda:GetFunction", "lambda:GetFunctionConfiguration", "lambda:InvokeAsync", "lambda:InvokeFunction", "lambda:RemovePermission", "lambda:UpdateFunctionCode", "lambda:UpdateFunctionConfiguration", "s3:*", "amplify:*" ], "Resource": "*" } ] }
정책 이름을 입력하시고 아래로 내리시면 '정책 생성' 버튼이 있으니 클릭해서 생성해주세요. 그리고 cmd로 다시 돌아가 앞서 했던 amplify init의 내용을 다시 입력하시면 프로젝트 생성이 되는 것을 확인할 수 있답니다.
마지막으로
지금까지 AWS Amplify + Android 프로젝트 생성 방법에 대해 알아보았습니다!
막상 쓰고 보니 너무 왕초보적인 내용을 다룬 것 같아 도움이 될 지 모르겠지만 저 같은 초보자 분들께 공감이 될 수 있는 내용으로 쓰려 노력했다는 것만 알아주셨으면 하는 바람뿐.. 쓸데없이 삽질을 너무해서 여기까지 밖에 다루지 못한 점은 죄송합니다ㅠㅠ 앞으로 계속 발전해서 더 많은 분들꼐 도움이 되는 내용을 전해드리고자하니 응원 부탁드려요ㅎㅎ
다음 블로그에서는 Amplify Framework에서 제공하는 서비스를 이용한 기능 구현에 대해 다뤄볼 예정입니다.
그럼 여러분 코로나 조심하시고, 함께 이겨내도록 해요! ?